package Controller;

import Model.Map;
import Model.Player;
import View.MapRenderer;
import View.Renderer;

import java.awt.*;
import java.awt.event.KeyEvent;

/**
 * Created by anton.kasiyanenko@stud.fh-luebeck.de on 21.10.2014.
 */
public class Engine {

    private Map map;
    private Player player;
    private Renderer renderer;
    private MapController controller;
    private boolean bool_collision              = false;
    private boolean bool_destination_reached    = false;


    public Engine(int width, int height, int scale, int cellSize, int AnzahlLebenPlayer){

        player = new Player(14, 18, 2f, AnzahlLebenPlayer);
        map = new Map(player, width, height, scale, cellSize);
        // renderer
        renderer = new MapRenderer(map);
        // controller
        controller = new MapController(map);

    }

    /**
     * Gibt an ob der Spieler mit einem Fußgänger zusammengestoßen ist.
     * @return Gab es eine Kollision
     */
    public boolean has_collision(){
        return bool_collision;
    }

    /**
     * Wird aufgerufen wenn es zu einer Kollision kam
     */
    public void set_collision(){
        bool_collision = true;
    }

    /**
     * Der Status, dass es eine Kollision gab wird zurückgesetzt
     */
    public void unset_collision(){
        bool_collision = false;
        ((MapRenderer) renderer).unset_collision();
    }

    /**
     * Gibt an ob der Spieler das andere Ende der Fußgängerzone erreicht hat.
     * @return Ziel erreicht
     */
    public boolean is_dest_reached(){
        return bool_destination_reached;
    }

    /**
     * Setzen, dass der Spieler das Ziel erreicht hat
     */
    public void set_dest_reached(){
        bool_destination_reached = true;
    }

    /**
     * Der Status, dass der Spieler das Ziel erreicht hat wird zurückgesetzt
     */
    public void unset_dest_reached(){
        bool_destination_reached = false;
        ((MapRenderer) renderer).unset_dest_reached();

    }

    public void update(float deltaTime, int level) {
        controller.update(deltaTime, level);
    }

    public void render(Graphics g, int level, int score) {
        renderer.render(g, level, score);
        if (((MapRenderer) renderer).has_collision() )
        {
            set_collision();
        }
        if (((MapRenderer) renderer).is_dest_reached() )
        {
            set_dest_reached();
        }

    }

    /**
     * Auswertung der Eingaben des Spielers
     * @param k Der Code der gedrückten Taste
     */
    public boolean keyPressed(int k) {

        boolean playerMoved = false;

        if(k == KeyEvent.VK_LEFT && map.getPlayer().getX() != 0) {
            System.out.println("Player moved left");
            map.getPlayer().setX(map.getPlayer().getX() - 1);
            playerMoved = true;
        }
        else if(k == KeyEvent.VK_RIGHT && map.getPlayer().getX() + 1 != map.cols) {
            System.out.println("Player moved right");
            map.getPlayer().setX(map.getPlayer().getX() + 1);
            playerMoved = true;
        }
        else if(k == KeyEvent.VK_UP && map.getPlayer().getY() != 0) {
            System.out.println("Player moved up");
            map.getPlayer().setY(map.getPlayer().getY() - 1);
            playerMoved = true;
        }
        else if(k == KeyEvent.VK_DOWN && map.getPlayer().getY() + 1 != map.rows) {
            System.out.println("Player moved down");
            map.getPlayer().setY(map.getPlayer().getY() + 1);
            playerMoved = true;
        }

        return playerMoved;
    }

    public void keyReleased(int k) {

    }
}
